home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / baseconv.lha / baseconv.c < prev    next >
C/C++ Source or Header  |  1993-09-13  |  3KB  |  112 lines

  1. /*****************************************************************
  2. *               BaseConv v1.1 © 1993, Xavier Sirvent             *
  3. * This is a little program able to convert numbers from one base *
  4. * to another. The bases must be lower or equal to 36             *
  5. *****************************************************************/
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. /* prototypes */
  12.  
  13. void Usage(char *);
  14. unsigned int rank(char charac, unsigned int base);
  15. unsigned long ToBase10(char *number, unsigned int base);
  16. char *FromBase10(unsigned long number, unsigned int base);
  17.  
  18. /* program */
  19.  
  20. void Usage(char *name)
  21. {
  22.    printf("Usage: %s <BaseFrom> <BaseTo> <number> [<number>...]\n\n",name);
  23.    exit(0);
  24. } /* Usage */
  25.  
  26. unsigned int rank(char charac, unsigned int BaseFrom)
  27. /* returns the value of the "charac" given in base "BaseFrom" */
  28. {
  29.    int i = -1;
  30.  
  31.    if (charac >= '0' && charac <= '9')
  32.       i = charac - '0';
  33.    else if (charac >= 'a' && charac <= 'z')
  34.            i = charac - 'a' + 10;
  35.         else if (charac >='A' && charac <= 'Z')
  36.                 i = charac - 'A' + 10;
  37.  
  38.    if ( (i == -1) || (i >= BaseFrom) ) {
  39.       printf("Error: %c is forbidden in base %d\n\n",charac,BaseFrom);
  40.       exit(1);
  41.    } /* if */
  42.  
  43.    return((unsigned)i);
  44. } /* rank */
  45.  
  46. unsigned long ToBase10(char *number, unsigned int BaseFrom)
  47. /* returns the value in base 10 of "number" given in base "BaseFrom" */
  48. {
  49.    unsigned long res=0,res2=0;
  50.    int i;
  51.  
  52.    for (i = 0 ; i < strlen(number) ; i++) {
  53.       res2 = res*BaseFrom+rank(number[i],BaseFrom);
  54.       if (res2 <= res) {
  55.          printf("%s is higher than 2^32\n",number);
  56.          exit(1);
  57.       } /* if */
  58.       res = res2;
  59.    } /* for */
  60.  
  61.    return(res);
  62. } /* ToBase10 */
  63.  
  64. char *FromBase10(unsigned long number, unsigned int BaseTo)
  65. /* display the number in BaseTo */
  66. {
  67.    char *result;
  68.    int i=0,j=0,mod=0;
  69.     char temp;
  70.  
  71.    result = (char *)calloc(33,1);
  72.    /* the result is generated in reverse order*/
  73.    while ((number != 0) && (i<80) ) {
  74.       mod = (number % BaseTo);
  75.       result[i++] = (mod <= 9)?(mod+'0'):(mod-10+'A');
  76.       number = number / BaseTo;
  77.    } /* while */
  78.  
  79.    /* making the result right order */
  80.  
  81.    while (j < i / 2) {
  82.        temp = result[j];
  83.         result[j] = result[i - j - 1];
  84.         result[i - j++ - 1] = temp;
  85.     }
  86.     return(result);    
  87. } /* FromBase10 */
  88.  
  89. void main(int argc, char *argv[])
  90. {
  91.    unsigned int BaseFrom, BaseTo, i=3;
  92.  
  93.    printf("\nBase Converter v1.1, © 1993 Xavier Sirvent\n");
  94.  
  95.    if (argc < 4)
  96.       Usage(argv[0]);
  97.  
  98.    BaseFrom = (unsigned)atol(argv[1]);
  99.    BaseTo = (unsigned)atol(argv[2]);
  100.  
  101.    if ((BaseFrom>36)||(BaseTo>36)||(BaseFrom<2)||(BaseTo<2)) {
  102.       printf("Error: <BaseFrom> and <BaseTo> must be in [2..36]\n\n");
  103.       exit(1);
  104.    } /* if */
  105.  
  106.    while (i < argc) {
  107.       printf("%s = %s\n",
  108.             argv[i],FromBase10(ToBase10(argv[i++],BaseFrom),BaseTo)
  109.                );
  110.        } /* while */
  111. } /* main */
  112.